#include <Arduino.h>
#include<ESP8266WiFi.h>
#include<ESP8266WebServer.h>
#include <FS.h>  
const int led=2;
const char*ssid="T-Maker Jay's AP Webserver";
const char*password="12345678";
ESP8266WebServer esp8266_server(80);
void handleLED();
void handleUserRequest();
String getContentType(String filename);
bool handleFileRead(String resource) ;

void handleLED() {      //处理灯信号控制
 String ledState = "OFF";
 String LED_State = esp8266_server.arg("LEDstate");
 Serial.println(LED_State);
 if(LED_State == "1"){
  digitalWrite(led,HIGH); //点亮灯
  ledState = "ON"; //反馈参数
 } else {
  digitalWrite(led,LOW); //关闭灯
  ledState = "OFF"; //反馈参数
 }
 esp8266_server.send(200, "text/plain", ledState); //发送网页
}

void setup() {
  delay(1000);
  pinMode(led,OUTPUT);
  Serial.begin(9600);
  Serial.println();
  WiFi.softAP(ssid,password);
  IPAddress myIP=WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  esp8266_server.on("/setLED", handleLED);//处理继电器控制请求
  esp8266_server.onNotFound(handleUserRequest); // 处理其它网络请求
  esp8266_server.begin();
  Serial.println("HTTP server started");
  if(SPIFFS.begin()){                       // 启动闪存文件系统
    Serial.println("SPIFFS Started.");
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }     
  
}

void loop() {
 esp8266_server.handleClient();
}

void handleUserRequest() {             
  // 获取用户请求资源(Request Resource）
  String reqResource = esp8266_server.uri();
  Serial.print("reqResource: ");
  Serial.println(reqResource); 
  // 通过handleFileRead函数处处理用户请求资源
  bool fileReadOK = handleFileRead(reqResource);
  // 如果在SPIFFS无法找到用户访问的资源，则回复404 (Not Found)
  if (!fileReadOK){                                                 
    esp8266_server.send(404, "text/plain", "404 Not Found"); 
  }
}
bool handleFileRead(String resource) {            //处理浏览器HTTP访问
  if (resource.endsWith("/")) {                   // 如果访问地址以"/"为结尾
    resource = "/index.html";                     // 则将访问地址修改为/index.html便于SPIFFS访问
  }  
  String contentType = getContentType(resource);  // 获取文件类型 
  if (SPIFFS.exists(resource)) {                     // 如果访问的文件可以在SPIFFS中找到
    File file = SPIFFS.open(resource, "r");          // 则尝试打开该文件
    esp8266_server.streamFile(file, contentType);// 并且将该文件返回给浏览器
    file.close();                                // 并且关闭文件
    return true;                                 // 返回true
  }
  return false;                                  // 如果文件未找到，则返回false
}
String getContentType(String filename){         // 获取文件类型
  if(filename.endsWith(".htm")) return "text/html";
  else if(filename.endsWith(".html")) return "text/html";
  else if(filename.endsWith(".css")) return "text/css";
  else if(filename.endsWith(".js")) return "application/javascript";
  else if(filename.endsWith(".png")) return "image/png";
  else if(filename.endsWith(".gif")) return "image/gif";
  else if(filename.endsWith(".jpg")) return "image/jpeg";
  else if(filename.endsWith(".ico")) return "image/x-icon";
  else if(filename.endsWith(".xml")) return "text/xml";
  else if(filename.endsWith(".pdf")) return "application/x-pdf";
  else if(filename.endsWith(".zip")) return "application/x-zip";
  else if(filename.endsWith(".gz")) return "application/x-gzip";
  return "text/plain";
}
